package com.im.common.config;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
public class BootstrapConfig {

    private TcpConfig lim;

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TcpConfig {
        private Integer tcpPort;  // tcp绑定的端口号
        private Integer webSocketPort;  // webSocket，绑定的端口号
        private boolean enableWebSocket;  // 是否启用webSocket
        private Integer bossThreadSize;  // boss线程大小，默认=1
        private Integer workThreadSize;  // work线程大小
        private Long heartBeatTime;  // 心跳超时时间，单位毫秒
        private Integer loginModel;  // 登陆模式
        private RedisConfig redis;  // redis配置
        private Rabbitmq rabbitmq;  // rabbitmq配置
        private ZkConfig zkConfig;  // zk配置
        private Integer brokerId;  // 应用实例的唯一ID，用于区分不同的应用实例或者集群
        private String logicUrl;  // 逻辑地址
    }

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ZkConfig {
        private String zkAddr;  // zk连接地址
        private Integer zkConnectTimeOut;  // zk连接超时时间
    }

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class RedisConfig {
        private String mode;  // 单机模式：single 哨兵模式：sentinel 集群模式：cluster
        private Integer database;  // 数据库
        private String password;  // 密码
        private Integer timeout;  // 超时时间
        private Integer poolMinIdle;  // 最小空闲数
        private Integer poolConnTimeout;  // 连接超时时间(毫秒)
        private Integer poolSize;  // 连接池大小
        private RedisSingle single;  // redis单机配置
    }

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class RedisSingle {
        private String address;  // 地址
    }

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Rabbitmq {
        private String host;  // 主机地址
        private Integer port;  // 端口
        private String virtualHost;  // 虚拟主机
        private String userName;  // 用户名
        private String password;  // 密码
    }

}